package org.haowentao.blo;


import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

//jerry 连接服务器的,com 是不能往服务器发送数据的
public class BioClient {
    public static void main(String[] args) throws Exception {
//
//        Thread thread1 = new Thread(() -> {
//                try {
//                    sendHello();
//                }catch (Exception e){
//                    throw new RuntimeException(e);
//                }
//        },"com");
//
//
//        Thread thread2 = new Thread(() -> {
//            try {
//                sendHello();
//            } catch (Exception e) {
//               throw new RuntimeException(e);
//            }
//        },"jerry");
//        thread1.start();
//        thread2.start();
//
//        //线程执行 也就是连接结束了
//        thread1.join();
//        thread2.join();

        String pp = "1234";
        String id = "1";
        String data = pp + id;
        //data为 pp+id 字节长度,按照 data的长度pp字节长度pp字符串id字节长度 id 数据 这样的数据格式呢
//        ByteBuffer byteBuffer = encodeData("124");
//        System.out.println(decodeData(byteBuffer));
    }

    //import java.nio.ByteBuffer;
    //import java.nio.ByteOrder;
    //import java.nio.charset.StandardCharsets;
    //
    //public class StructuredDataExample {
    //
    //    public static void main(String[] args) {
    //        // 原始数据
    //        String pp = "1234";
    //        String id = "1";
    //
    //        // 编码数据
    //        ByteBuffer buffer = encodeData(pp, id);
    //        System.out.println("编码后数据大小: " + buffer.limit() + " 字节");
    //
    //        // 模拟网络传输
    //        byte[] networkData = new byte[buffer.limit()];
    //        buffer.get(networkData);
    //
    //        // 解码数据
    //        ByteBuffer receivedBuffer = ByteBuffer.wrap(networkData);
    //        receivedBuffer.order(ByteOrder.BIG_ENDIAN); // 设置字节序
    //        String[] decoded = decodeData(receivedBuffer);
    //
    //        System.out.println("解码结果 - pp: " + decoded[0]);
    //        System.out.println("解码结果 - id: " + decoded[1]);
    //    }
    //
    //    /**
    //     * 编码数据
    //     * @param pp 第一部分数据
    //     * @param id 第二部分数据
    //     * @return 编码后的ByteBuffer
    //     */
    //    public static ByteBuffer encodeData(String pp, String id) {
    //        // 转换为字节数组
    //        byte[] ppBytes = pp.getBytes(StandardCharsets.UTF_8);
    //        byte[] idBytes = id.getBytes(StandardCharsets.UTF_8);
    //
    //        // 检查长度限制
    //        if (ppBytes.length > 255) {
    //            throw new IllegalArgumentException("pp数据过长，最大支持255字节");
    //        }
    //        if (idBytes.length > 255) {
    //            throw new IllegalArgumentException("id数据过长，最大支持255字节");
    //        }
    //
    //        // 计算总长度 (2 + 1 + pp长度 + 1 + id长度)
    //        int totalLength = 2 + 1 + ppBytes.length + 1 + idBytes.length;
    //
    //        // 创建缓冲区
    //        ByteBuffer buffer = ByteBuffer.allocate(totalLength);
    //        buffer.order(ByteOrder.BIG_ENDIAN); // 设置网络字节序（大端）
    //
    //        // 1. 写入总长度 (2字节)
    //        buffer.putShort((short) (totalLength - 2)); // 减去自身长度
    //
    //        // 2. 写入pp长度 (1字节)
    //        buffer.put((byte) ppBytes.length);
    //
    //        // 3. 写入pp数据
    //        buffer.put(ppBytes);
    //
    //        // 4. 写入id长度 (1字节)
    //        buffer.put((byte) idBytes.length);
    //
    //        // 5. 写入id数据
    //        buffer.put(idBytes);
    //
    //        // 切换为读模式
    //        buffer.flip();
    //        return buffer;
    //    }
    //
    //    /**
    //     * 解码数据
    //     * @param buffer 包含结构化数据的ByteBuffer
    //     * @return 解码后的字符串数组 [pp, id]
    //     */
    //    public static String[] decodeData(ByteBuffer buffer) {
    //        // 1. 读取总长度 (2字节)
    //        int totalLength = Short.toUnsignedInt(buffer.getShort());
    //
    //        // 2. 读取pp长度 (1字节)
    //        int ppLength = Byte.toUnsignedInt(buffer.get());
    //
    //        // 3. 读取pp数据
    //        byte[] ppBytes = new byte[ppLength];
    //        buffer.get(ppBytes);
    //
    //        // 4. 读取id长度 (1字节)
    //        int idLength = Byte.toUnsignedInt(buffer.get());
    //
    //        // 5. 读取id数据
    //        byte[] idBytes = new byte[idLength];
    //        buffer.get(idBytes);
    //
    //        // 转换为字符串
    //        String pp = new String(ppBytes, StandardCharsets.UTF_8);
    //        String id = new String(idBytes, StandardCharsets.UTF_8);
    //
    //        return new String[]{pp, id};
    //    }
    //}
    private  static void sendHello() throws Exception {
        Socket socket = new Socket();
        //进行连接
        socket.connect(new InetSocketAddress("localhost", 8082));
        OutputStream outputStream = socket.getOutputStream();
        for (int i = 0; i < 10; i++) {
            String userName = "lis";
            byte[] usernameBytes = userName.getBytes("UTF-8");
//            ByteBuffer buffer = ByteBuffer.allocate(6 + usernameBytes.length + objectLength);


            String string = new String(Thread.currentThread().getName() + " say hello" + i);
            System.out.println(string);
            outputStream.write(string.getBytes());
            //如果不刷新数据 那么 服务器读取会报错
            outputStream.flush();
        }
        //连接没有断开 那么服务端则就读取失败了 因此
        Thread.sleep(1000);
        //win 需要手动进行关闭
        socket.close();
    }

    public static ByteBuffer encodeData(String data,Integer id) {
        byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
        byte[] ids = String.valueOf(id).getBytes(StandardCharsets.UTF_8);
        // 检查数据长度是否超过255
        if (dataBytes.length > 255) {
            throw new IllegalArgumentException("数据过长，最大支持255字节");
        }
        ByteBuffer buffer = ByteBuffer.allocate(3 + dataBytes.length +ids.length);

        // 写入长度头 (无符号字节)
        buffer.put((byte) dataBytes.length);

        // 写入实际数据
        buffer.put(dataBytes);




        // 切换为读模式
        buffer.flip();

        return buffer;
    }

    public static String decodeData(ByteBuffer buffer) {
        // 读取长度头 (转为无符号整数)
        int length = Byte.toUnsignedInt(buffer.get());

        // 检查缓冲区剩余数据是否足够
        if (buffer.remaining() < length) {
            throw new IllegalArgumentException("数据不完整，预期长度: " + length +
                    ", 实际剩余: " + buffer.remaining());
        }

        // 读取数据内容
        byte[] dataBytes = new byte[length];
        buffer.get(dataBytes);

        return new String(dataBytes, StandardCharsets.UTF_8);
    }


}
